home *** CD-ROM | disk | FTP | other *** search
- MODULE ListDir;
- __IMP_SWITCHES__
- #ifdef HM2
- #ifdef __LONG_WHOLE__
- (*$!i+: Modul muss mit $i- uebersetzt werden! *)
- (*$!w+: Modul muss mit $w- uebersetzt werden! *)
- #else
- (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
- (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
- #endif
- #endif
- (* Test und Anwendungsbeispiel fuer die Verzeichnisprozeduren
- *
- * Benutzung: listdir [ Muster [ Verzeichnis ... ]]
- *
- * Vorsicht beim Aufruf in einer Kommandoshell: Das Muster muss hier
- * ``gequoted'' werden!
- * Bei der Angabe des Musters ist zu beachten, dass zwischen Gross- und
- * Kleinschreibung unterschieden wird.
- *
- * hk, 02-Okt-93
- *)
-
-
- VAL_INTRINSIC
- CAST_IMPORT
- PTR_ARITH_IMPORT
-
- FROM SYSTEM IMPORT
- (* TYPE *) ADDRESS,
- (* PROC *) ADR;
-
- FROM PORTAB IMPORT
- (* CONST*) NULL,
- (* TYPE *) WORDSET, SIGNEDWORD, UNSIGNEDWORD, UNSIGNEDLONG;
-
- IMPORT e;
-
- FROM types IMPORT
- (* CONST*) PATHMAX,
- (* TYPE *) FileName, PathName, StrPtr;
-
- FROM file IMPORT
- (* TYPE *) FileModes, modeT, StatRec,
- (* PROC *) lstat, sISCHR, sISDIR, sISBLK, sISREG, sISFIFO, sISLNK;
-
- FROM dir IMPORT
- (* TYPE *) DIR, DirentPtr, DirentRec,
- (* PROC *) opendir, readdir, rewinddir, closedir, chdir, getcwd;
-
- FROM cmdline IMPORT
- (* PROC *) ArgCount, GetArg;
-
- FROM cstr IMPORT
- (* PROC *) AssignCToM2, strerror;
-
- FROM pSTRING IMPORT
- (* PROC *) COMPARE;
-
- FROM POSIX2 IMPORT
- (* TYPE *) FNMFlags,
- (* PROC *) fnmatch;
-
- FROM lib IMPORT
- (* PROC *) qsort;
-
- FROM InOut IMPORT
- (* PROC *) Read, Write, WriteString, WriteLn, WriteCard;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- CONST
- MAXCOUNT = 255;
-
- VAR
- HOME : PathName;
- list : ARRAY [0..MAXCOUNT] OF FileName;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
- #if (defined HM2) || (defined HM2_OLD)
- (*$E+ Prozedur als Parameter erlaubt *)
- #endif
- PROCEDURE CompStr ((* EIN/ -- *) cmp1 : ADDRESS;
- (* EIN/ -- *) cmp2 : ADDRESS ): INTEGER;
-
- VAR p1, p2 : POINTER TO FileName;
-
- BEGIN
- p1 := cmp1;
- p2 := cmp2;
- RETURN(COMPARE(p1^, p2^));
- END CompStr;
- #if (defined HM2) || (defined HM2_OLD)
- (*$E=*)
- #endif
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE DoList ((* EIN/ -- *) dir : PathName;
- (* EIN/ -- *) pattern : ARRAY OF CHAR );
-
- VAR void : INTEGER;
- dirp : DIR;
- dp : DirentPtr;
- count, i: SIGNEDWORD;
- errstr : ARRAY [0..40] OF CHAR;
- attr : ARRAY [0..10] OF CHAR;
- st : StatRec;
- t : CHAR;
- total : CARDINAL;
- kB : CARDINAL;
- file : FileName;
-
- BEGIN
- WriteString("Dateimuster: "); WriteString(pattern); WriteLn;
- WriteString("Verzeichnis: "); WriteString(dir); WriteLn;
-
- dirp := opendir(dir);
- IF dirp = NULL THEN
- strerror(e.errno, errstr);
- WriteString("opendir: "); WriteString(errstr); WriteLn;
- RETURN;
- END;
-
- count := 0;
- dp := readdir(dirp);
- WHILE dp <> NULL DO
- AssignCToM2(dp^.dName, file);
- IF fnmatch(file, pattern, FNMFlags{}) = 0 THEN
- IF count < MAXCOUNT THEN
- list[count] := file;
- INC(count);
- ELSE
- void := closedir(dirp);
- void := chdir(HOME);
- WriteString("DoList: tab overflow"); WriteLn;
- RETURN;
- END;
- END; (* IF fnmatch() *)
- dp := readdir(dirp);
- END;
- void := closedir(dirp);
-
- qsort(ADR(list),
- VAL(UNSIGNEDLONG,count),
- VAL(UNSIGNEDLONG,ABS(DIFADR(ADR(list[1]), ADR(list[0])))),
- CompStr);
-
- void := chdir(dir); (* damit "lstat()" die Dateien findet *)
- total := 0;
- FOR i := 0 TO count - 1 DO
- IF lstat(list[i], st) < 0 THEN
- strerror(e.errno, errstr);
- WriteString("lstat: "); WriteString(list[i]); WriteString(": ");
- WriteString(errstr); WriteLn;
- ELSE
- WITH st DO
- attr := "----------";
- t := ' ';
-
- IF sISREG(stMode) THEN
- IF sIXUSR IN stMode THEN
- t := '*';
- END;
- ELSIF sISDIR(stMode) THEN
- attr[0] := 'd'; t := '/';
- ELSIF sISCHR(stMode) THEN
- attr[0] := 'c';
- ELSIF sISLNK(stMode) THEN
- attr[0] := 'l'; t := '@';
- ELSIF sISFIFO(stMode) THEN
- attr[0] := 'p'; t := '|';
- ELSIF sISBLK(stMode) THEN
- attr[0] := 'b';
- ELSE
- attr[0] := '?';
- END;
-
- IF sIRUSR IN stMode THEN
- attr[1] := 'r';
- END;
- IF sIRGRP IN stMode THEN
- attr[4] := 'r';
- END;
- IF sIROTH IN stMode THEN
- attr[7] := 'r';
- END;
- IF sIWUSR IN stMode THEN
- attr[2] := 'w';
- END;
- IF sIWGRP IN stMode THEN
- attr[5] := 'w';
- END;
- IF sIWOTH IN stMode THEN
- attr[8] := 'w';
- END;
- IF sIXUSR IN stMode THEN
- attr[3] := 'x';
- END;
- IF sIXGRP IN stMode THEN
- attr[6] := 'x';
- END;
- IF sIXOTH IN stMode THEN
- attr[9] := 'x';
- END;
- WriteCard(VAL(CARDINAL,stIno), 4);
- kB := VAL(CARDINAL,(VAL(UNSIGNEDLONG,stSize) + LC(1023)) DIV LC(1024));
- WriteCard(kB, 5);
- Write(' ');
- WriteString(attr);
- WriteCard(VAL(CARDINAL,stNlink), 3);
- Write(' ');
- WriteString(list[i]); Write(t);
- WriteLn;
- INC(total, kB);
- END; (* WITH *)
- END; (* IF lstat *)
- END; (* FOR *)
- WriteString("-----------------------"); WriteLn;
- WriteCard(total, 9); WriteString("kB total"); WriteLn;
- void := chdir(HOME);
- END DoList;
-
- (*===========================================================================*)
-
- VAR
- voidp : StrPtr;
- i : INTEGER;
- ch : CHAR;
- argc : INTEGER;
- DIRS : PathName;
- PAT : PathName;
-
- BEGIN
- voidp := getcwd(CAST(StrPtr,ADR(HOME)), PATHMAX+1);
- WriteString("akt. Verzeichnis: ");
- WriteString(HOME);
- WriteLn;
- WriteLn;
-
- DIRS := ".";
- PAT := "*";
-
- argc := ArgCount();
- IF argc <= 1 THEN
- DoList(DIRS, PAT);
- ELSIF argc <= 2 THEN
- GetArg(1, PAT);
- DoList(DIRS, PAT);
- ELSE
- GetArg(1, PAT);
- FOR i := 2 TO argc - 1 DO
- GetArg(i, DIRS);
- DoList(DIRS, PAT);
- WriteLn;
- END;
- END;
- Read(ch);
- END ListDir.
-